package run.siyuan.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import run.siyuan.mapper.QjMapper;
import run.siyuan.model.Qj;
import run.siyuan.model.Req;
import run.siyuan.model.TaskVo;

import java.util.HashMap;
import java.util.Map;

@Service
public class QjService {


    @Autowired
    private QjMapper qjMapper;

    @Autowired
    private FlowService flowService;


    /**
     * 提交请假单
     *
     * @param req
     */
    @Transactional
    public boolean submitApplication(Req req) {
        //从数据库查询当前信息
        Qj qj = qjMapper.selectById(req.getId());
        if (qj == null) {
            throw new RuntimeException("请假单不存在");
        }
        if ("3".equals(qj.getApprovalStatus())) {
            throw new RuntimeException("已审批通过,不能提交");
        }

        //业务key 用于待办已办 扩展字段 展示使用
        //我这里以 流程定义key + 主键 + 申请单名称 的方式命名
        String businessKey = "Process_1681567231742." + qj.getId() + "." + qj.getName();
        //参数 分支条件
        Map<String, Object> map = new HashMap<>();
        // >=3走一级审批  <3走 三级审批
        map.put("num", qj.getDay());
        //如果流程实例为空 启动一个新的流程实例
        String instanceId = flowService.startProcessInstance(businessKey, map, qj.getInstanceId());
        //保存instanceId到数据库
        qj.setInstanceId(instanceId);
        //审批状态改为 2:审批中
        qj.setApprovalStatus("2");
        qjMapper.updateById(qj);
        return true;
    }

    /**
     * 获取请假审批任务信息
     *
     * @param current
     * @param size
     * @return
     */
    public IPage<TaskVo> getTaskPage(int current, int size) {
        Page<?> page = new Page<>();
        page.setCurrent(current);
        page.setSize(size);
        IPage<TaskVo> taskPage = qjMapper.getTaskPage(page);
        return taskPage;
    }

    @Transactional
    public boolean approval(Req req) {
        //从数据库查询当前信息
        Qj qj = qjMapper.selectById(req.getId());
        if (qj == null) {
            throw new RuntimeException("请假单不存在");
        }
        //2:审批中
        if (!"2".equals(qj.getApprovalStatus())) {
            throw new RuntimeException("状态不是审批中,不能审批");
        }
        //参数 分支条件
        Map<String, Object> map = new HashMap<>();
        //通过:true  驳回false
        map.put("flag", req.getFlag());
        String res = flowService.complete(qj.getInstanceId(), map, qj.getId(), req.getApprovalComments(), req.getApprover());
        if ("end".equals(res)) {
            //如果流程已经走完了 那么吧审批状态修改为 3:审批通过
            qj.setApprovalStatus("3");
            qjMapper.updateById(qj);
        }
        if ("false".equals(req.getFlag())) {
            //如果是驳回 那么修改状态为 未提交
            qj.setApprovalStatus("1");
            qjMapper.updateById(qj);
        }
        return true;
    }




}